package com.jqweb.utils;

import io.jsonwebtoken.*;
import io.jsonwebtoken.security.Keys;

import javax.crypto.SecretKey;
import java.nio.charset.StandardCharsets;
import java.sql.Date;

import java.util.Map;


public class JWT {
    // 定义一个长度为32字节的密钥字符串（256位）
    private static final String secretKey = "your-very-secure-secret-key-with-length-of-32-bytes"; // 确保长度为32字节

    public static String setJwt (Map<String, Object> data) {
        // 生成JWT的时间
        long expMillis = System.currentTimeMillis() + 1000 * 60 * 60 * 24 * 7; // 一周
        Date exp = new Date(expMillis);
        SecretKey key = Keys.hmacShaKeyFor(secretKey.getBytes(StandardCharsets.UTF_8));
        JwtBuilder builder = Jwts.builder()
                // 设置签名使用的签名算法和签名使用的秘钥
                .signWith(key)
                // 如果有私有声明，一定要先设置这个自己创建的私有的声明，这个是给builder的claim赋值，一旦写在标准的声明赋值之后，就是覆盖了那些标准的声明的
                .claims(data)
                // 设置过期时间
                .expiration(exp);
        return builder.compact();// 生成token
    }

    // 解析jwt并返回Claims对象
    public static Claims parseJwt(String token) {
        try {
            //生成 HMAC 密钥，根据提供的字节数组长度选择适当的 HMAC 算法，并返回相应的 SecretKey 对象。
            SecretKey key = Keys.hmacShaKeyFor(secretKey.getBytes(StandardCharsets.UTF_8));
            // 得到DefaultJwtParser
            JwtParser jwtParser = Jwts.parser()
                    // 设置签名的秘钥
                    .verifyWith(key)
                    .build();
            Jws<Claims> jws = jwtParser.parseSignedClaims(token);
            return jws.getPayload();
        } catch (Exception e) {
            return null;
        }
    }

    // 验证token是否有效
    public static boolean validateToken(String token) {
        return parseJwt(token) != null;
    }

    // 从token中获取指定键的值
    public static Object getClaimValue(String token, String key) {
        Claims claims = parseJwt(token);
        return claims != null ? claims.get(key) : null;
    }

    // 获取token中的所有数据
    public static Map<String, Object> getAllClaims(String token) {
        return parseJwt(token);
    }
}

